package cho114366.basic;

import java.util.ArrayList;

public class J22_Generic {

	// ArraList에서 처럼 문법오류는 없는데 저장소오류 발생을 줄이기 위해

	public static void main(String[] args) {
		// 컬렉션 프레임워크를 구성하는 핵심 기술
		// 흔히, 타입 매개변수라고 불리우는 <E>,<K>,<V>등의
		// 다이아몬드 기호를 이용해서 컬렉션의 요소들을
		// [일반화]할 수 있음
		// 이것을 통해 엄격한 자료형 검사도 할 수 있고
		// 불필요한 형변환도 방지할 수 있음
		J22_Tiger tiger = new J22_Tiger();
		J22_lion lion = new J22_lion();
		J22_Zibra zibra = new J22_Zibra();
		ArrayList zoo = new ArrayList();

		zoo.add(tiger);
		zoo.add(lion);
		zoo.add(zibra);

		// tiger = zoo.get(0); // 오류!가 생긴다 형변환....
		tiger = (J22_Tiger) zoo.get(0);
		// 우리에서 꺼낼때 귀찮게도 형변환이 필요
		lion = (J22_lion) zoo.get(1);
		zibra = (J22_Zibra) zoo.get(2);

		// 하지만, 아래의 문제가 발생할 수 있음!!//값이 이미 있으면 오류//컴파일오류가 아니라 런타임오류
		// 즉, 엄격한 자료형 검사를 컴파일 단계에서
		// 하지 않았기 때문에 실행시 오류가 표시됨
		// zibra = (J22_Zibra) zoo.get(0);// J22_Tiger cannot be cast to
		// cho114366.basic.J22_Zibra
		/*-----------------------------------------------------------------*/
		// <E> : Element, 배열요소의 자료형 의미
		ArrayList<J22_Tiger> cage1 = new ArrayList<J22_Tiger>();
		ArrayList<J22_lion> cage2 = new ArrayList<>(); // JDK7
		ArrayList<J22_Zibra> cage3 = new ArrayList<>(); // JDK7
		// ArrayList 에 타입 매개변수로 Tiger를 지정하면
		// 해당 ArrayList에는 Tiger형의 객체만 저장가능

		cage1.add(tiger);
		// cage1.add(lion);
		// cage1.add(zibra);
		tiger = cage1.get(0);
		// lion = cage1.get(0);
		// 컴파일시점에 불일치 자료형 불일치 오류 표시
		tiger.howl();
	}
}

class J22_Tiger {

	public void howl() {
		System.out.println("호랑이가 울어요");
	}
}

class J22_lion {

	public void howl() {
		System.out.println("사자가 울어요");
	}
}

class J22_Zibra {
	public void howl() {
		System.out.println("얼룩말이  울어요");
	}
}